﻿#include "study08.h"

// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170

/*
线程的头文件是 <thread> 线程的创建与管理：
	1. std::thread t(func, args); // 创建线程，传入函数和参数，返回一个线程对象 t
		func: 要创建的线程函数指针，参数为 args
	2. t.detach(); // 线程分离，将线程从创建它的线程分离出来，可以自己控制线程的运行和结束
	3. t.join(); // 等待线程结束，直到线程结束才继续运行
	std::this_thread::get_id() // 获取当前线程的 ID
	std::thread::hardware_concurrency() // 获取系统的 CPU 核心数
	std::thread::id::hash() // 获取线程 ID 的哈希值
	std::this_thread::sleep_for(1s) // 线程休眠，指定时间内(这里是一秒)线程暂停运行
	std::this_thread::yield() // 线程挂起，线程让步，暂停当前线程的执行，让出 CPU 资源，让其他线程运行

线程的同步机制：
	1. std::mutex mtx; // 互斥锁，用于线程同步
	2. mtx.lock(); // 锁定互斥锁，进入临界区
	3. mtx.unlock(); // 解锁互斥锁，退出临界区
	4. std::condition_variable cv; // 条件变量，用于线程间同步
	5. cv.wait(mtx); // 等待条件变量通知，进入临界区
	6. cv.notify_one(); // 通知一个等待线程，唤醒一个线程
	7. cv.notify_all(); // 通知所有等待线程，唤醒所有线程

线程的计时机制：
	1. std::chrono::high_resolution_clock::now() // 获取当前时间，精度高
	2. std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() // 时间差转换为毫秒数
	3. std::this_thread::sleep_for(1s) // 线程休眠，指定时间内(这里是一秒)线程暂停运行

线程的排序类型：
	1. 单线程：单线程就是只有一个线程，所有的任务都在这个线程上完成，这种方式效率最高，但是只能处理一些简单的任务。
	2. 多线程：多线程就是有多个线程，可以同时处理多个任务，这种方式可以提高处理效率，但是需要考虑线程同步、线程安全等问题。
	3. 异步：异步就是任务不是在同一时刻完成，而是分成多个步骤，每个步骤完成后通知主线程，主线程再根据情况进行下一步操作。这种方式可以提高处理效率，但是需要考虑线程同步、线程安全等问题。
	4. 并行：并行就是多个任务同时执行，这种方式可以提高处理效率，但是需要考虑线程同步、线程安全等问题。
	5. 并发：并发就是多个任务交替执行，这种方式可以提高处理效率，但是需要考虑线程同步、线程安全等问题。
	6. 串行：串行就是只有一个任务执行，这种方式效率最低，但是可以处理一些简单的任务。

C++ 的多维数组：
	多维数组是通过指针数组实现的；多维数组在内存中的分布一般是零散的，从第二维度开始每一个维度都是一个指针数组；
	这就导致了访问多维数组时远比访问一维数组慢，所以在做优化时，可以考虑将多维数组变成一维数组

算法库中的 sort() 函数也是使用快速排序的一种实现方式，使用如下：
	1. sort(first, last) // 排序范围，first 和 last 为迭代器（指针类型）
	2. sort(first, last, cmp) // 自定义比较函数，cmp 函数指针返回 bool
	注意：sort() 函数是 C++ 标准库中的算法库，需要包含 <algorithm> 头文件
*/
const char ed = '\n';    // 输出换行符

int main()
{
	using namespace std;
	using namespace std::chrono_literals; // 时间精度命名空间声明
	// 线程与计时测试
	{
		print_start("线程与计时测试");
		cout << "the main thread is: " << this_thread::get_id() << ed;
		//test_thread();

		test_time();

		print_end("线程与计时测试");
	}

	// 多维数组学习测试
	print_start("多维数组学习测试");
	test_multilayer_array();
	print_end("多维数组学习测试");

	// 数组排序测试
	print_start("数组排序测试");
	test_sort();
	print_end("数组排序测试");

	system("pause");
	return 0;
}